#include <setjmp.h> void longjmp(env, value); jmp_buf env; переменная, в которойхранится окружение int value; значение, возвращаемое при вызове setjmp.
Описание.
Функция longjmp восстанавливает состояние стека, ранее сохраненное в env функцией setjmp .
Функции setjmp и longjmp обеспечивают возможность выполнения нелокального (nonlocal ) перехода и обычно используются для передачи управления на выполнение обработки ошибок; восстанавливают код в ранее вызванной процедуре (без использования обычного вызова); возвращают условные обозначения.
Вызовом setjmp сохраняется текущее состояние стека в env. Последующий вызов longjmp восстанавливает сохраненное состояние и возвращает управление на указатель (точку входа), непосредственно следующий за соответствующим вызовом setjmp .
Выполнение возобновляется, когда вызов setjmp возвращает заданное value . Когда вызывается longjmp , значения всех переменных (за исключением переменных регистра) становятся доступными для процедуры, которая принимает управление и содержит значения этих переменных. Значения переменных регистра непредсказуемы.
Функция longjmp должна вызываться ранее функции, определяющей возврат setjmp . Если longjmp вызвана после функции, определяющей возврат setjmp, то может произойти непредсказуемое поведение программы.
Значение value , возвращаемое longjmp , должно быть ненулевым. Если для value задан аргумент 0, значение возврата заменяется значением 1.
Возвращаемое значение.
Возвращаемого значения нет.
Предупреждение!
Значения переменных регистра в процедуре, вызывающей setjmp , после выполнения longjmp не могут быть восстановлены к собственным значениям.
Пример:
#include <stdio.h>
#include <setjmp.h>
jmp_buf mark;
main()
{
if (setjmp(mark) != 0)
{ printf("longjmp has been called\n");
recover();
exit(1);
}
printf("setjmp has been called\n");
.
.
.
p();
.
.
.
}
p()
{
int error = 0;
.
.
.
if (error != 0)
longjmp(mark, -1);
.
.
.
}
recover()
{
/* при выходе из программы убедитесь, что файлы данных не
будут запорчены */
.
.
.
}